package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 实现对jdbc流程的二次封装
 * 静态常量属性（所有对象公用同一套属性,且属性不可以随意更改）
 * 0-驱动类名，url，用户名密码
 * 方法
 * 1-注册驱动，获取链接
 * 2-关闭资源
 * 3-查询
 * 4-增删改
 * @author sfq
 *【注】请根据自己实际的账号信息进行修改
 */
public class BaseDao {
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
	public static final String USERNAME ="system";
	public static final String PASSWORD = "fengqiao123";
	//1,2方法均需要使用 提升作用域
	Connection conn = null;
	PreparedStatement ps = null;
	
	//方法1,注册驱动,获取连接
	public Connection getConn() {
		try {
			Class.forName(DRIVER);
			conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	//方法2,关闭资源
	public void close() {
		try {
			if(ps!=null) {
				ps.close();
			}
			if(conn!=null) {
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 方法3  封装查询
	 * 1,传递参数列表  
	 * 		a.sql语句
	 * 		b.未知数量的 条件参数     Object[]
	 * 2,方法 方法体代码逻辑
	 * 		注册驱动，获取链接
	 * 		传sql语句进行预编译 ---> 拼接sql语句  ---> 执行并获取结果集
	 * 3,返回值类型 ResultSet
	 */
	 public ResultSet query(String sql,Object[] params) {
		 conn = this.getConn();
		 ResultSet rs = null;
		 try {
			 //通过传进来的sql语句 创建ps对象
			ps = conn.prepareStatement(sql);
			//对参数数组做空值判断
			if(params!=null) {
				// 遍历params参数数组，依次通过 ps对象 拼接sql语句
				for(int i=0;i<params.length;i++) {
					ps.setObject(i+1, params[i]);
				}
			}
			//发送执行sql语句，获取结果集
			rs = ps.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 return rs;
	 }
	/**
	 * 方法4 封装增删改
	 * 1,参数列表
	 * 		a,sql语句
	 * 		b,拼接在sql上的动态参数
	 * 2,方法体
	 * 		注册驱动，建立连接
	 * 		获取ps对象预编译，拼接sql语句，发送执行sql语句
	 * 3,返回值类型  int
	 */
	 public int update(String sql,Object[] params) {
		 conn = this.getConn();
		 int count = 0;
		 try {
			ps = conn.prepareStatement(sql);
			//对params进行空值判断
			if(params!=null) {
				//拼接sql语句
				for(int i=0;i<params.length;i++) {
					ps.setObject(i+1, params[i]);
				}
			}
			count = ps.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			this.close();
		}
		 return count;
	 }
	
}
